﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//struct Book
//{
//	char name[20];
//	char author[20];
//	float price;
//	char id[20];
//}b3,b4;//全局变量
//
//struct Book b2;//全局变量
//int main()
//{
//	struct Book b1;//局部变量
//	struct Book arr[5];//数组
//	return 0;
//}

//struct Book
//{
//	char name[20];
//	char author[20];
//	float price;
//	char id[20];
//};

//int main()
//{
//	struct Book b1 = { "鹏哥C语言","鹏哥",18.8,"PG10001" };
//	struct Book b2 = { .id = "PG1002",.author = "鹏哥",.name = "C语言",.price = 3.14 };
//
//
//	return 0;
//}

//struct 
//{
//	char c;
//	int i;
//	double d;
//}s = { 'x',100,3.14 };
//
//int main()
//{
//	printf("%c %d %lf", s.c, s.i, s.d);
//	return 0;
//}
//匿名结构体只能使用一次
//struct
//{
//	char c;
//	int i;
//	double d;
//}s;
//
//struct
//{
//	char c;
//	int i;
//	double d;
//}*ps;
//
//int main()
//{
//	ps = &s;
//	return 0;
//}

//typedef struct
//{
//	char c;
//	int i;
//	double d;
//}S;
//
//int main()
//{
//	S s;
//	return 0;
//}

//typedef struct LNode
//{
//	int data;
//	struct LNode* next;
//}LNode,*LinkList;

//typedef struct LNode
//{
//	int data;
//	struct LNode* next;
//};
//typedef struct LNode LNode;
//匿名的结构体类型不能实现这种自引用的效果的
//typedef struct LNode
//{
//	int data;
//	struct LNode* next;
//}LNode,*LinkList;
//int main()
//{
//	LNode n1;
//	
//	return 0;
//}

//struct S
//{
//	char c1;
//	int i;
//	char c2;
//};

//struct S2
//{
//	char c1;
//	char c2;
//	int i;
//};

//struct S3  //16
//{
//	double d;// 8 8 8
//	char c;// 1 8 1
//	int i;//4 8 4
//};
//struct S4
//{
//	char c1;
//	struct S3 s3;
//	double d;
//};
//int main()
//{
//	struct S2 s = { 0 };
//	printf("%zd\n", sizeof(s));
//	return 0;
//}

//#pragma pack(1)//设置默认对⻬数为1
//struct S
//{
//	char c1;//1 1 1
//	int i;//4 1 1
//	char c2;//1 1 1
//};
//#pragma pack()
//
//int main()
//{
//	struct S s = { 0 };
//	printf("%zd\n", sizeof(s));
//	return 0;
//}

//struct S
//{
//	int arr[1000];
//	int n;
//	double d;
//};
//void print1(struct S tmp)
//{
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", tmp.arr[i]);
//	}
//	printf("%d ", tmp.n);
//	printf("lf ", tmp.d);
//}
//void print2(struct S* tmp)
//{
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		printf("%d ", tmp->arr[i]);
//	}
//	printf("%d ", tmp->n);
//	printf("lf ", tmp->d);
//}
//int main()
//{
//	struct S s = { {1,2,3,4,5},100,3.14 };
//	//print1(s);
//	print2(&s);
//	return 0;
//}

////结构体实现位段
//struct S
//{
//	//位段式结构
//	int _a:2;//只占2个bit位
//	int _b:5;//只占5个bit位
//	int _c : 10;//只占10个bit位
//	int _d:30;//只占30个bit位
//};
////位段是专门用来节省内存的
//int main()
//{
//	printf("%zd\n", sizeof(struct S));
//	return 0;
//}


//1.申请到一块内存，从左向右使用，还是从右向左，不确定
//2.剩余空间，不足下一个成员使用，是浪费？，还是继续使用？不确定
//vs 1.从右向左  2.浪费
struct S
{
	char a : 3;
	char b : 4;
	char c : 5;
	char d : 4;
};
int main()
{
	struct S s = { 0 };
	s.a = 10;
	s.b = 12;
	s.c = 3;
	s.d = 4;
	printf("%zd\n", sizeof(s));
	
	return 0;
}

//struct A
//{
//	int _a : 2;
//	int _b : 5;
//	int _c : 10;
//	int _d : 30;
//};
//int main()
//{
//	struct A sa = { 0 };
//	//scanf("%d", &(sa._b));//这是错误的
//
//	//正确的⽰范
//	int b = 0;
//	scanf("%d", &b);
//	sa._b = b;
//	return 0;
//}
